#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100 //定义最大队列长度
#define OVERFLOW 1
#define OK 0
#define ERROR 0

typedef int QElemType;
typedef struct
{
	QElemType *base; //初始化的动态分配存储空间
	int front;		 //头指针,若队列不空，指向队列头元素
	int rear;		 //尾指针，若队列不空，指向队尾元素的下一个位置
} SqQueue;
//初始化
int InitQueue(SqQueue &Q)
{															   //构造一个空队列Q
	Q.base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType)); //动态存储分配空间
	if (!Q.base)											   //存储分配失败
		exit(OVERFLOW);
	Q.front = Q.rear = 0; //队空
	return OK;
}
//返回元素个数
int QueueLength(SqQueue Q) //求队列的长度，即元素个数
{
	return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
//入队
int EnQueue(SqQueue &Q, QElemType e)
{
	if ((Q.rear + 1) % MAXSIZE == Q.front) //队满
		exit(OVERFLOW);
	Q.base[Q.rear] = e;				 //新元素加入队尾
	Q.rear = (Q.rear + 1) % MAXSIZE; //队尾指针+1
	return OK;
}
//出队
int DeQueue(SqQueue &Q, QElemType &e)
{	//若队列不空，则删除Q的队头元素，用e返回其值，并返回OK
	//否则返回ERROR
	if (Q.rear == Q.front)
		return ERROR;
	e = Q.base[Q.front]; //保存队头元素
	printf("%d  ", e);
	Q.front = (Q.front + 1) % MAXSIZE; //队头指针+1
	return OK;
}
int main()
{
	SqQueue Q;
	InitQueue(Q);
	EnQueue(Q, 1); //入队
	EnQueue(Q, 4);
	EnQueue(Q, 3);
	QElemType e;
	for (int i = 0; i < 3; i++)
	{
		// QElemType e;
		DeQueue(Q, e); //出队
	}
	return 0;
}